--===========================================================================--
-- Naziv		: Instruction Fetch
-- Ime fajla	: i_fetch.vhd  
-- Verzija		: 0.2
--===========================================================================-- 

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity i_fetch is 
	  port (
		--IN
		   reset,clk : in  std_logic ;
		   stall,branch  : in std_logic;
		   newPC : in std_logic_vector (15 downto 0 );		   
		--BUFFER
		   PC_if : buffer std_logic_vector (15 downto 0 );
		--OUT
		   I_ABUS : out std_logic_vector (15 downto 0); --Adresna magistrala za instrukcije
		   I_RD : out std_logic --Kontrolna magistrala za instrukcije, signal read
	  );
end;
architecture i_fetch_AR of i_fetch is

signal PC: std_logic_vector(15 downto 0); --PC je brojac koji je uvak za jedan ispred, a PC_if je adresa instrukcije koja se trenutno obradjuje.
	
begin
	i_fetch_PR: process (clk,reset) is
	begin
		if reset='1' then
			PC <= "0000000000000000";
			PC_if <= "0000000000000000";
			I_ABUS <= "ZZZZZZZZZZZZZZZZ";
			I_RD <= '0';
		elsif rising_edge(clk) then --mora da se ubaci i uslov da je procitano
			if stall='0' then 
				I_RD <= '1';
				if branch = '1' then 
					I_ABUS <= newPC;								  --Dolazi do skoka
					PC_if <= newPC;  --U PC_if se upisuje adresa koja se obradjuje
					PC <= std_logic_vector(unsigned(newPC)+1 );	--U PC ide adresa skoka +1
				else 
					I_ABUS <= PC;							  --Nastavlja se sukcesivno
					PC_if <= PC;
					PC <= std_logic_vector(unsigned(PC)+1); --PC se inkrementira
				end if;
			--else
				--I_ABUS <= PC_if;
			end if;
		end if;
	end process; 
end i_fetch_AR;